home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / emula / arosdv19.lha / AROS / scripts / cint2.awk < prev    next >
Text File  |  1996-09-12  |  11KB  |  480 lines

  1. BEGIN {
  2.     date="29-10-95";
  3.     TYPES["ULONG"]=1;
  4.     TYPES["LONG"]=1;
  5.     TYPES["UBYTE"]=1;
  6.     TYPES["BYTE"]=1;
  7.     TYPES["UWORD"]=1;
  8.     TYPES["WORD"]=1;
  9.     TYPES["APTR"]=1;
  10.     TYPES["BPTR"]=1;
  11.     TYPES["STRPTR"]=1;
  12.     TYPES["BSTR"]=1;
  13.     TYPES["BOOL"]=1;
  14.     TYPES["Tag"]=1;
  15.     TYPES["FLOAT"]=1;
  16.     TYPES["DOUBLE"]=1;
  17.     TYPES[""]=1;
  18.     TYPES[""]=1;
  19.  
  20.     # 1- types
  21.     # 2- commands
  22.     KEYWORDS["struct"]=2;
  23.     KEYWORDS["int"]=1;
  24.     KEYWORDS["char"]=1;
  25.     KEYWORDS["double"]=1;
  26.     KEYWORDS["float"]=1;
  27.     KEYWORDS["for"]=10;
  28.     KEYWORDS["if"]=10;
  29.     KEYWORDS["else"]=10;
  30.     KEYWORDS["do"]=10;
  31.     KEYWORDS["while"]=10;
  32.     KEYWORDS["switch"]=10;
  33.     KEYWORDS["case"]=10;
  34.     KEYWORDS["break"]=10;
  35.     KEYWORDS["continue"]=10;
  36.     KEYWORDS["goto"]=10;
  37.     KEYWORDS["union"]=2;
  38.     KEYWORDS["enum"]=2;
  39.     KEYWORDS["typedef"]=1;
  40.     KEYWORDS["void"]=1;
  41.     KEYWORDS["unsigned"]=3;
  42.     KEYWORDS["signed"]=3;
  43.     KEYWORDS["const"]=3;
  44.     KEYWORDS["long"]=3;
  45.     KEYWORDS["short"]=3;
  46.     KEYWORDS[""]=0;
  47.     KEYWORDS[""]=0;
  48.  
  49.     SpecialStructs["exec"]="ExecBase";
  50.     SpecialStructs["graphics"]="GfxBase";
  51.     SpecialStructs["dos"]="DosLibrary";
  52.     SpecialStructs["intuition"]="IntuitionBase";
  53.  
  54.     spaces=" ";
  55.     for (t=0; t<10; t++)
  56.     spaces=spaces spaces;
  57.  
  58.     for (arg=1; arg<ARGC; arg++)
  59.     {
  60.     part_name=ARGV[arg];
  61.     Part_name=toupper(substr(part_name,1,1)) substr(part_name,2);
  62.  
  63.     if (part_name in SpecialStructs)
  64.         struct_name=SpecialStructs[part_name];
  65.     else
  66.         struct_name="Library";
  67.  
  68. print "Working on " part_name "..."
  69.  
  70.     dir=part_name "/";
  71.     system("mkdir " part_name);
  72.     print dir;
  73.     INPUT="include/fd/" part_name "_lib.fd"
  74.     print INPUT
  75.  
  76.     # Read LVO
  77.     delete LVO
  78.     while ((getline line < INPUT) > 0)
  79.     {
  80.         if (substr(line,1,6) == "##bias")
  81.         offset = int(substr(line,7))/6;
  82.         else if (substr(line,1,6) == "##base")
  83.         {
  84.         match(line,"[A-Za-z_][A-Za-z0-9_]*$");
  85.         Base = substr(line,RSTART+1,RLENGTH-1);
  86.         }
  87.         else if (!match (line,/[*#]/))
  88.         {
  89.         match(line,"[A-Za-z_][A-Za-z0-9_]*");
  90.         fname=substr(line,RSTART,RLENGTH);
  91.         line=substr(line,RSTART+RLENGTH);
  92.         if (match(line,"[(][^)]*[)]"))
  93.         {
  94.             if (RLENGTH!=2)
  95.             fargs=substr(line,RSTART+1,RLENGTH-2);
  96.             else
  97.             fargs="";
  98.         }
  99.         else
  100.             fargs="";
  101.         line=substr(line,RSTART+RLENGTH);
  102.         if (match(line,"[(][^)]*[)]"))
  103.         {
  104.             if (RLENGTH!=2)
  105.             fregs=substr(line,RSTART+1,RLENGTH-2);
  106.             else
  107.             fregs="";
  108.         }
  109.         else
  110.             fregs="";
  111.         #print fname " (" fargs ") (" fregs ") " offset
  112.         LVO[fname] = offset;
  113.         offset ++;
  114.         LVO_regs[fname] = toupper(fregs);
  115.         }
  116.     }
  117.  
  118.     INPUT="include/clib/" part_name "_protos.h"
  119.     #print INPUT
  120.     getline line < INPUT
  121.     yyinit(line);
  122.     rt_type="";
  123.  
  124.     #if (!match(FILENAME,"\/.*_"))
  125.     #{
  126.     #    print "Can't find libname"
  127.     #    exit (10);
  128.     #}
  129.     #dir=substr(FILENAME,RSTART+1,RLENGTH-2);
  130.     #
  131.     #if (dir!="")
  132.     #{
  133.     #    system("mkdir " dir);
  134.     #    part_name=dir;
  135.     #    dir=dir "/";
  136.     #}
  137.  
  138.     while ((token=yylex()) != "EOF")
  139.     {
  140.     #print "0 -" token "-" yyval "-"
  141.         if ((token=="keyword" && KEYWORDS[yyval]<10) || token=="typedef")
  142.         {
  143.         plevel=0;
  144.         token=read_type(token);
  145.         fname = yyval;
  146.         token=yylex();
  147.  
  148.         if (token=="(")
  149.         {
  150.             plevel ++;
  151.             token=yylex();
  152.  
  153.             if (rt_ptr!="")
  154.             ret=rt_type " " rt_ptr;
  155.             else
  156.             ret=rt_type;
  157.  
  158.             if (token==")")
  159.             {
  160.             npar=1;
  161.             par_type[1]="void";
  162.             par_ptr[1]="";
  163.             par_name[1]="";
  164.             }
  165.             else
  166.             {
  167.             npar=0;
  168.             while (token!=")")
  169.             {
  170.     #print 1
  171.                 if (token==",")
  172.                 token=yylex();
  173.                 token=read_type(token);
  174.                 if (token=="ident")
  175.                 {
  176.                 name=yyval;
  177.                 token=yylex();
  178.                 }
  179.                 else
  180.                 name="";
  181.  
  182.     #                 if (plevel != 1)
  183.     #                 {
  184.     #                 plevel --;
  185.     #                 name=name ") "
  186.     #                 while((token==yylex())!=")" || plevel!=1)
  187.     #                 {
  188.     #print 2
  189.     #                     if (token=="(")
  190.     #                     plevel ++;
  191.     #                     else if (token==")")
  192.     #                     plevel --;
  193.     #                     name=name " " yyval;
  194.     #                 }
  195.     #                 }
  196.  
  197.                 npar++;
  198.                 par_type[npar]=rt_type;
  199.                 par_ptr[npar]=rt_ptr;
  200.                 par_name[npar]=name;
  201.     #print "npar " npar "-" rt_type "-" rt_ptr "-" name
  202.             }
  203.             }
  204.  
  205.             print "Processing "fname"..."
  206.             #file="/dev/stdout"
  207.             file=dir tolower(fname) ".c"
  208.  
  209.             if (fname in LVO)
  210.             {
  211.             offset=LVO[fname];
  212.             regs=LVO_regs[fname];
  213.             }
  214.             else
  215.             {
  216.             offset=-1;
  217.             regs="";
  218.             }
  219.  
  220.             printf ("/*\n") > file;
  221.             print "    (C) 1995-96 AROS - The Amiga Replacement OS" >> file
  222.             printf ("    %sId$\n", "$") >> file;
  223.             printf ("    %sLog$\n", "$") >> file;
  224.             printf ("\n") >> file;
  225.             printf ("    Desc:\n") >> file;
  226.             printf ("    Lang: english\n") >> file;
  227.             printf ("*/\n") >> file;
  228.             printf ("#include \"%s_intern.h\"\n\n", part_name) >> file;
  229.             print "/*****************************************************************************\n" >> file
  230.             print "    NAME */" >>file
  231.             print "\t#include <clib/" part_name "_protos.h>\n">>file
  232.  
  233.             if (offset!=-1)
  234.             {
  235.             if (npar==1 && par_type[1]=="void" && par_ptr[1] == "" &&
  236.                 par_name[1]=="")
  237.                 print "\t__AROS_LH0("ret", "fname",\n" >>file
  238.             else
  239.                 print "\t__AROS_LH"npar"("ret", "fname",\n" >>file
  240.             print "/*  SYNOPSIS */" >>file
  241.  
  242.             if (npar==1 && par_type[1]=="void" && par_ptr[1] == "" &&
  243.                 par_name[1]=="")
  244.             {
  245.                 print "\t/* void */" >>file
  246.             }
  247.             else
  248.             {
  249.                 maxlen=0;
  250.                 for (t=1; t<=npar; t++)
  251.                 {
  252.     #print 3
  253.                 len=length(par_type[t]);
  254.                 len2=length(par_ptr[t]);
  255.                 len+=len2 ? len2+1 : 0;
  256.                 if (len > maxlen)
  257.                     maxlen = len;
  258.                 }
  259.  
  260.                 for (t=1; t<=npar; t++)
  261.                 {
  262.     #print 4
  263.                 len=length(par_type[t]);
  264.                 len2=length(par_ptr[t]);
  265.  
  266.                 printf("\t__AROS_LHA(%s", par_type[t])>>file;
  267.                 printf("%s", substr(spaces,1,maxlen-len-len2))>>file;
  268.                 printf("%s, %s, %s),\n",par_ptr[t],par_name[t],
  269.                     substr(regs,1,2))>>file;
  270.                 if (regs!="")
  271.                 {
  272.                     regs=substr(regs,4);
  273.                 }
  274.                 }
  275.             }
  276.             print "\n/*  LOCATION */\n\tstruct "struct_name" *, "Base", "offset", "Part_name")">>file
  277.             }
  278.             else
  279.             {
  280.             print "\t"ret" "fname" (\n" >>file
  281.             print "/*  SYNOPSIS */" >>file
  282.  
  283.             if (npar==1 && par_type[1]=="void" && par_ptr[1] == "" &&
  284.                 par_name[1]=="")
  285.             {
  286.                 print "\tvoid)" >>file
  287.             }
  288.             else
  289.             {
  290.                 maxlen=0;
  291.                 for (t=1; t<=npar; t++)
  292.                 {
  293.     #print 3
  294.                 len=length(par_type[t]);
  295.                 len2=length(par_ptr[t]);
  296.                 len+=len2 ? len2+1 : 0;
  297.                 if (len > maxlen)
  298.                     maxlen = len;
  299.                 }
  300.  
  301.                 for (t=1; t<=npar; t++)
  302.                 {
  303.     #print 4
  304.                 len=length(par_type[t]);
  305.                 len2=length(par_ptr[t]);
  306.  
  307.                 printf("\t%s", par_type[t])>>file;
  308.                 printf("%s", substr(spaces,1,maxlen-len-len2))>>file;
  309.                 printf("%s %s",par_ptr[t],par_name[t])>>file;
  310.                 if (t==npar)
  311.                     printf(")\n")>>file;
  312.                 else
  313.                     printf(",\n")>>file;
  314.                 }
  315.             }
  316.             }
  317.             print "\n/*  FUNCTION\n\n    INPUTS\n\n    RESULT\n\n    NOTES\n">>file
  318.             print "    EXAMPLE\n\n    BUGS\n\n    SEE ALSO\n\n    INTERNALS\n">>file
  319.             print "    HISTORY\n\t" date "    digulla automatically created from">>file
  320.             print "\t\t\t    "part_name"_lib.fd and clib/"part_name"_protos.h\n">>file;
  321.             print "*****************************************************************************/" > file
  322.             print "{">>file;
  323.             print "    __AROS_FUNC_INIT">>file;
  324.             if (Base!="")
  325.             print "    __AROS_BASE_EXT_DECL(struct "struct_name" *,"Base")">>file;
  326.             print "    __AROS_FUNC_EXIT">>file;
  327.             print "} /* " fname " */">>file;
  328.             fclose (file);
  329.         } # found "("
  330.         } # found keyword
  331.     } # while token != EOF
  332.     } # for all args
  333. } # BEGIN
  334.  
  335. function read_type(pretoken     ,token) {
  336.     token=pretoken;
  337. #print "token3 " token "-" yyval
  338.  
  339.     rt_type="";
  340.     while ((token=="keyword" && KEYWORDS[yyval]<10) || token=="typedef" ||
  341.     token=="...")
  342.     {
  343. #print 5
  344.     rt_type=rt_type " " yyval;
  345.     if (KEYWORDS[yyval]==2)
  346.     {
  347.         token=yylex();
  348.         rt_type=rt_type " " yyval;
  349.     }
  350.     token=yylex();
  351. #print "token2 " token
  352.     }
  353.     rt_type=substr(rt_type,2);
  354. #print "type " rt_type
  355.  
  356.     rt_ptr="";
  357.     while (token=="*" || token=="(")
  358.     {
  359. #print 6
  360.     rt_ptr=rt_ptr yyval;
  361.     if (token=="(")
  362.         plevel++;
  363.     token=yylex();
  364. #print "token1 " token
  365.     }
  366. #print "ptr " rt_ptr
  367.  
  368.     return token;
  369. }
  370.  
  371. function yyinit(str) {
  372.     yyrest=str;
  373. }
  374.  
  375. function yylex() {
  376. #print yylex
  377.     for (yyagain=1; yyagain; )
  378.     {
  379.     yyagain=0;
  380.     if (yyrest=="" || match(yyrest,/^[ \t\014\r]+/))
  381.     {
  382.         while (1)
  383.         {
  384.         while (yyrest=="")
  385.         {
  386.             if ((getline yyrest < INPUT) != 1)
  387.             return "EOF";
  388. #print "1 -" yyrest "-"
  389.             if (substr(yyrest,1,1) == "#")
  390.             yyrest="";
  391.         }
  392.         if (!match(yyrest,"^[ \t\014\r]+"))
  393.             break;
  394.         yyrest=substr(yyrest,RSTART+RLENGTH);
  395.         }
  396.     }
  397.     if (match(yyrest,/^\/\*/))
  398.     {
  399.         yyrest=substr(yyrest,3);
  400.         while (!match(yyrest,"\*\/"))
  401.         {
  402.         if ((getline yyrest < INPUT) != 1)
  403.             return "EOF";
  404. #print "2 -" yyrest "-"
  405.         }
  406.         yyrest=substr(yyrest,RSTART+RLENGTH);
  407.         yyagain=1;
  408.     }
  409.     }
  410.     if (match(yyrest,"^[a-zA-Z_][a-zA-Z0-9_]*"))
  411.     {
  412.     yyval=substr(yyrest,RSTART,RLENGTH);
  413.     yyrest=substr(yyrest,RSTART+RLENGTH);
  414.  
  415.     if (yyval in TYPES)
  416.         return "typedef";
  417.     else if (yyval in KEYWORDS)
  418.         return "keyword";
  419.     else
  420.         return "ident";
  421.     }
  422.     if (match(yyrest,"^0[xX][0-9a-f]+[lL]?"))
  423.     {
  424.     yyval=substr(yyrest,RSTART,RLENGTH);
  425.     yyrest=substr(yyrest,RSTART+RLENGTH);
  426.     return "int_const";
  427.     }
  428.     if (match(yyrest,/^([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)([eE][0-9]+)?[fF]?/))
  429.     {
  430.     yyval=substr(yyrest,RSTART,RLENGTH);
  431.     yyrest=substr(yyrest,RSTART+RLENGTH);
  432.     return "float_const";
  433.     }
  434.     if (match(yyrest,"^0[0-7]+[lL]?"))
  435.     {
  436.     yyval=substr(yyrest,RSTART,RLENGTH);
  437.     yyrest=substr(yyrest,RSTART+RLENGTH);
  438.     return "int_const";
  439.     }
  440.     if (match(yyrest,"^[1-9][0-9]*[lL]?"))
  441.     {
  442.     yyval=substr(yyrest,RSTART,RLENGTH);
  443.     yyrest=substr(yyrest,RSTART+RLENGTH);
  444.     return "int_const";
  445.     }
  446.     if (match(yyrest,"^\""))
  447.     {
  448.     if (match(yyrest,"^\"(\\\"|[^\"])*\""))
  449.     {
  450.         yyval=substr(yyrest,RSTART,RLENGTH);
  451.         yyrest=substr(yyrest,RSTART+RLENGTH);
  452.         return "str_const";
  453.     }
  454.     else
  455.     {
  456.         yyval=substr(yyrest,1,length(yyrest)-1);
  457.         while (1)
  458.         {
  459.         if ((getline yyrest < INPUT) != 1)
  460.             return "EOF";
  461.         if (match(yyrest,"^(\\\"|[^\"])*\""))
  462.             break;
  463.         yyval=yyval substr(yyrest,1,length(yyrest)-1);
  464.         }
  465.         yyval=yyval substr(yyrest,RSTART,RLENGTH);
  466.         yyrest=substr(yyrest,RSTART+RLENGTH);
  467.         return "str_const";
  468.     }
  469.     }
  470.     if (substr(yyrest,1,3)=="...")
  471.     {
  472.     yyval="...";
  473.     yyrest=substr(yyrest,4);
  474.     return yyval;
  475.     }
  476.     yyval=substr(yyrest,1,1);
  477.     yyrest=substr(yyrest,2);
  478.     return yyval;
  479. }
  480.